<?php
/**
 *  User：LRZ
 *  Date：2020/2/1
 *  Time：15:01
 */

/**
 *  1260.二维网格迁移
 *
 *  标签：数组
 *
 *  给你一个 m 行 n 列的二维网格 grid 和一个整数 k。你需要将 grid 迁移 k 次。
 *  每次「迁移」操作将会引发下述活动：
 *      位于 grid[i][j] 的元素将会移动到 grid[i][j + 1]。
 *      位于 grid[i][n - 1] 的元素将会移动到 grid[i + 1][0]。
 *      位于 grid[m - 1][n - 1] 的元素将会移动到 grid[0][0]。
 *  请你返回 k 次迁移操作后最终得到的 二维网格。
 *
 *  示例 1：
 *      输入：grid = [[1,2,3],[4,5,6],[7,8,9]], k = 1
 *      输出：[[9,1,2],[3,4,5],[6,7,8]]
 *
 *  示例 2：
 *      输入：grid = [[3,8,1,9],[19,7,2,5],[4,6,11,10],[12,0,21,13]], k = 4
 *      输出：[[12,0,21,13],[3,8,1,9],[19,7,2,5],[4,6,11,10]]
 *
 *  示例 3：
 *      输入：grid = [[1,2,3],[4,5,6],[7,8,9]], k = 9
 *      输出：[[1,2,3],[4,5,6],[7,8,9]]
 *   
 *  提示：
 *      1 <= grid.length <= 50
 *      1 <= grid[i].length <= 50
 *      -1000 <= grid[i][j] <= 1000
 *      0 <= k <= 100
 *
 *  来源：力扣（LeetCode）
 *  链接：https://leetcode-cn.com/problems/shift-2d-grid
 *  著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */

$start = microtime(true);

$grid = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
$k    = 1;
$res  = shiftGrid($grid, $k);

$end = microtime(true);
print_r($res);
printf(' total run: %.2f s<br>' . 'memory usage: %.2f M<br> ', $end - $start, memory_get_usage() / 1024 / 1024);

function shiftGrid($grid, $k)
{
    $arr = [];
    $n   = count($grid[0]);

    foreach ($grid as $i => $iv) {
        foreach ($iv as $j => $jv) {
            $arr[] = $grid[$i][$j];
        }
    }

    $size = count($arr);
    foreach ($arr as $key => $value) {
        $i            = $key / $n;
        $j            = $key % $n;
        $grid[$i][$j] = $arr[(($size - $k % $size) + $key) % $size];
    }

    return $grid;
}